package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Ap0stoL2
 * Date: 2023-07-24
 * Time: 9:51
 */
//Thread类自带的线程标志位
public class Demo9 {
    public static void main(String[] args) throws InterruptedException {
        Thread t =new Thread(()->{

            //currentThread() 是获取当前线程的引用对象(Thread),但是lambda表达式是在构造t之前就定义好的,应为这里还没有创建就引用t是非法的,所以只能这干才能获取构造好的t
            //Thread 提供了一个静态方法isInterrupted(),在哪个线程调用这个方法,就能获取到哪个线程的标志位,true应该结束,false则线程先不必结束
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("i am thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                    break;//线程的sleep被interrupt()打断后抛出异常,这里break就医不对异常做操作而继续运行
                }
            }
        });

        t.start();
        Thread.sleep(5000);
        //把上面t的标志位设置成true,相当于唤醒,但是sleep也会涉及到唤醒和睡眠,这就导致可能在sleep的时候被强制唤醒了,手动的唤醒优先级更高
        //线程在sleep的过程中,线程调用interrupt的方法时就会强制使sleep抛出一个异常,sleep就被立即唤醒
        //但是sleep在被唤醒的时候,会自动清除标志位(给程序员留下更多操作,没到点该如何让操作,留给程序员),interrupt给标志位设置成true,但是sleep唤醒后会清除标志位,如果没有break则程序会死循环
        t.interrupt();
    }
}
